from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
from web import models
import datetime


class Tracer(object):
    '''
    封装用户和当前用户的价格策略
    '''

    def __init__(self):
        self.user = None
        self.price_policy = None
        self.project = None

class AuthMiddleware(MiddlewareMixin):

    def process_request(self, request):
        # 如果用户没有登录

        if not request.session.get('user'):
            return
        # 用户登录的情况
        # 获取用户的信息
        # 把Tracer对象 存储到 request中
        request.tracer = tracer_object= Tracer()
        username = request.session.get('user')['username']
        user_object = models.UserInfo.objects.filter(username=username).first()
        # 把用户的对象存储到 Tracer对象中
        request.tracer.user = user_object



        # 判断访问的路由是否时后台界面
        project_path = request.path.startswith('/api/project/')
        manage_path = request.path.startswith('/api/manage/')

        # 如果访问的不是后台路径 放行
        # if not project_path or not manage_path:
        #     return
        # 如果访问的是后台路径 并且没有登录  返回主页面

        if project_path and not request.tracer.user:
            return redirect('web:index')
        # 如果访问的是后台路径 并且没有登录  返回主页面
        if manage_path and not request.tracer.user:
            return redirect('web:index')
        # 如果访问的是后台路径 并且登录

        if project_path and username:

            transition_object = models.Transaction.objects.filter(
                user__username=username,
                status=2
            ).order_by('-id').first()
            # 获取当前时间
            current = datetime.datetime.now()
            # 获取用户的价格策略
            # 判断用户的交易记录的收费版本是否存在 并且没有过期
            if transition_object.end_datetime and transition_object.end_datetime < current:
                # 如果过期  request对象存储为 免费版
                request.tracer.price_policy = models.PricePolicy.objects.filter(category=1).first()
            # 没有过期   用户的价格策略存入request 对象中
            else:
                request.tracer.price_policy = transition_object.price_policy
        elif manage_path and username:
            transition_object = models.Transaction.objects.filter(
                user__username=username,
                status=2
            ).order_by('-id').first()
            # 获取当前时间
            current = datetime.datetime.now()
            # 获取用户的价格策略
            # 判断用户的交易记录的收费版本是否存在 并且没有过期
            if transition_object.end_datetime and transition_object.end_datetime < current:
                # 如果过期  request对象存储为 免费版
                request.tracer.price_policy = models.PricePolicy.objects.filter(category=1).first()
            # 没有过期   用户的价格策略存入request 对象中
            else:
                request.tracer.price_policy = transition_object.price_policy

    def process_view(self,request,view,args,kwargs):
        if request.path.startswith('/api/manage/'):
            id=kwargs.get('project_id')
            #判断是否我创建的项目
            project_obj=models.Project.objects.filter(id=id,creator=request.tracer.user).first()
            project_obj_join=models.ProjectUser.objects.filter(project_id=id,user=request.tracer.user).first()
            if project_obj:
                #我创建的项目
                request.tracer.project=project_obj
                return
            elif project_obj_join:
                #我参与的项目
                request.tracer.project = project_obj_join.project
                return
            else:
                #不是我的项目
                return redirect('web:project_list')
        else:
            #别的路径 非后台
            #重定向 项目列表
           pass
class Auth2Middlearae(MiddlewareMixin):
    '''
    访问地址过滤
    '''

    def process_request(self, request):
        return
        # # 查看是否访问后台项目管理界面
        #
        # # 判断访问的路由是否时后台界面
        # project_path = request.path.startswith('/api/project/')
        # # 如果访问的不是后台路径 放行
        # if not project_path:
        #     return
        # # 如果访问的是后台路径 并且没有登录  返回主页面
        # if project_path and not request.tracer:
        #     return redirect('web:index')
        # # 如果访问的是后台路径 并且登录
        # if project_path and request.tracer:
        #     username = request.tracer['username']
        #     transition_object = models.Transaction.objects.filter(
        #         user__username=username,
        #         status=2
        #     ).order_by('-id').first()
        #     # 获取当前时间
        #     current = datetime.datetime.now()
        #     # 获取用户的价格策略
        #     # 判断用户的交易记录的收费版本是否存在 并且没有过期
        #     if transition_object.end_datetime and transition_object.end_datetime < current:
        #         # 如果过期  request对象存储为 免费版
        #         request.policy = models.PricePolicy.objects.filter(category=1).first()
        #     # 没有过期   用户的价格策略存入request 对象中
        #     else:
        #         request.policy = transition_object.price_policy
